<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>函数作用域和声明提前</title>
	</head>
	<body>
		<script type="text/javascript">
			/* JavaScript的函数作用域是指在函数内声明的所有变量，在函数体内始终是可见的。
			 这意味着在声明之前甚至已经可用。
			 JavaScript的这个特性被非正式的称为声明提前(hoisting)。
			 即Javascript函数里声明的所有变量(但不涉及赋值)都被"提前"至函数体的顶部。*/
			 
			var scope = "global";
			function func1(){
				console.log(scope);//其结果为: undefined
				var scope;//声明语句
				scope= "local";//初始化语句，变量在这里赋初始值,但变量本身在函数体内的任何地方均是有定义的.
				console.log(scope);//其结果为: local
			}
			func1();
			
			/* 重点： 由于函数作用域的特性，局部变量在整个函数体中始终是有定义的，也就是说，在函数体内局部变量遮盖了同名的全局变量。
					尽管如此，只用在程序执行到var语句的时候，局部变量才会被正真赋值，因此，上述过程等价于，将函数内的变量声明"提起"至函数整体顶部，
					同时变量初始化留在原来的位置。*/
			
			console.log(func2());
			console.log(func3());
			
			function func2(){
				console.log("函数执行。")
			}
			
			
			var func3 = function(){//func3变量的声明虽然会提前，但是初始化语句不会被提前,
									//因此会报:func3 is not a function;
				console.log("执行函数func3");
			}
		</script>
	</body>
</html>
